import 'package:dio/dio.dart';
import 'package:shouyin_app/common/utils/utils.dart';

import 'http.dart';

class AdapterInterceptor extends Interceptor {


  static const String _kDefaultText = '无返回信息!';

  static const String _kSuccessFormat = '{"code":${ErrorHandle.success},"msg":"%s"}';
  static const String _kFailureFormat = '{"code":%d,"msg":"%s"}';


  @override
  void onResponse(Response response, ResponseInterceptorHandler handler) {
    final Response<dynamic> r = adapterData(response);
    super.onResponse(r, handler);
  }

  @override
  void onError(DioException err, ErrorInterceptorHandler handler) {
    switch (err.type) {
    // 连接服务器超时
      case DioExceptionType.connectionTimeout:
        {
          // 根据自己的业务需求来设定该如何操作,可以是弹出框提示/或者做一些路由跳转处理
          LogUtils.GGQ('http error===connectTimeout:>${err.message}');
        }
        break;
    // 发送超时
      case DioExceptionType.sendTimeout:
        {
          // 根据自己的业务需求来设定该如何操作,可以是弹出框提示/或者做一些路由跳转处理
          LogUtils.GGQ('http error===sendTimeout:>${err.message}');
        }
        break;
    // 响应超时
      case DioExceptionType.receiveTimeout:
        {
          // 根据自己的业务需求来设定该如何操作,可以是弹出框提示/或者做一些路由跳转处理
          LogUtils.GGQ('http error===receiveTimeout:>${err.message}');
        }
        break;
    // 证书无效
      case DioExceptionType.badCertificate:
        {
          // 根据自己的业务需求来设定该如何操作,可以是弹出框提示/或者做一些路由跳转处理
          LogUtils.GGQ('http error===badCertificate:>${err.message}');
        }
        break;
    // HTTP响应错误
      case DioExceptionType.badResponse:
        {
          // 根据自己的业务需求来设定该如何操作,可以是弹出框提示/或者做一些路由跳转处理
          LogUtils.GGQ('http error===badResponse:>${err.message}');
        }
        break;
    // 请求取消
      case DioExceptionType.cancel:
        {
          // 根据自己的业务需求来设定该如何操作,可以是弹出框提示/或者做一些路由跳转处理
          LogUtils.GGQ('http error===cancel:>${err.message}');
        }
        break;
    // 连接服务器错误
      case DioExceptionType.connectionError:
        {
          // 根据自己的业务需求来设定该如何操作,可以是弹出框提示/或者做一些路由跳转处理
          LogUtils.GGQ('http error===connectionError:>${err.message}');
        }
        break;
    // 未知错误
      case DioExceptionType.unknown:
        {
          // 根据自己的业务需求来设定该如何操作,可以是弹出框提示/或者做一些路由跳转处理
          LogUtils.GGQ('http error===unknown:>${err.message}');
        }
        break;
      default: {
        {
          // 根据自己的业务需求来设定该如何操作,可以是弹出框提示/或者做一些路由跳转处理
          LogUtils.GGQ('http error===default:>${err.message}');
        }
        break;
      }
    }

    // if (err.response != null) {
    //   adapterData(err.response!);
    // }
    super.onError(err, handler);
  }


  Response<dynamic> adapterData(Response<dynamic> response) {
    String result;
    String content = response.data?.toString() ?? '';
    /// 成功时，直接格式化返回
    if (response.statusCode == ErrorHandle.success) {
      if (content.isEmpty) {
        content = _kDefaultText;
        result = sprintf(_kSuccessFormat, [content]);
      } else {
        result = content;
      }
    } else {
      if(content.isEmpty) {
        content = _kDefaultText;
        result = sprintf(_kFailureFormat, [ErrorHandle.unknownError,content]);
      } else {
        result = content;
      }
      String msg = ErrorHandle.getMessage(response.statusCode);
      result = sprintf(_kFailureFormat, [response.statusCode,msg]);
    }
    response.data = result;
    return response;
  }
}